import socket
import datetime
def write_file(file_path, data, mode='w', encoding='utf-8'):
    """
    将数据写入文件
    
    参数:
    file_path (str): 文件路径
    data: 要写入的数据（字符串或字节）
    mode (str): 写入模式，可选：
        'w'  - 覆盖写入（默认）
        'a'  - 追加写入
        'wb' - 二进制覆盖写入
        'ab' - 二进制追加写入
    encoding (str): 文本编码（默认utf-8），二进制模式时忽略
    """
    try:
        # 二进制模式不需要指定编码
        if 'b' in mode:
            with open(file_path, mode) as f:
                f.write(data)
        else:
            with open(file_path, mode, encoding=encoding) as f:
                f.write(data)
        return True
    except Exception as e:
        print(f"写入文件失败: {e}")
        return False

def generate_number_range(start, end):
    """
    生成两个数字之间的所有自然数，用逗号分隔的字符串
    
    参数:
    start (int/float): 起始数字
    end (int/float): 结束数字
    
    返回:
    str: 用逗号分隔的自然数字符串
    """
    # 确保参数是数字
    if not isinstance(start, (int, float)) or not isinstance(end, (int, float)):
        raise ValueError("参数必须是数字")
    
    # 转换为整数
    start_int = int(start)
    end_int = int(end)
    
    # 确定范围的起始和结束
    min_num = min(start_int, end_int)
    max_num = max(start_int, end_int)
    
    # 生成数字范围
    numbers = list(range(min_num, max_num + 1))
    
    # 转换为逗号分隔的字符串
    result = ', '.join(map(str, numbers))
    
    return result
def check_ports(ip_address, port_list):
    """
    检查指定IP地址的端口状态
    
    参数:
    ip_address (str): 要检查的IP地址
    port_list (str): 用逗号分隔的端口列表，例如 "80,443,22"
    
    输出:
    打印时间、IP、端口、状态信息
    """
    # 将端口字符串分割成列表
    ports = port_list.split(',')
    
    # 打印表头
    print("时间\t\tIP\t\t端口\t状态")
    print("-" * 50)
    
    # 检查每个端口
    for port_str in ports:
        try:
            port = int(port_str.strip())
            
            # 创建socket对象
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.settimeout(0.02)  # 设置超时时间为1秒
            
            # 尝试连接
            result = sock.connect_ex((ip_address, port))
            
            # 获取当前时间
            current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            
            # 判断端口状态
            if result == 0:
                status = "开放"
            else:
                status = "关闭"
            
            # 输出结果
            print(f"{current_time}\t{ip_address}\t{port}\t{status}")
            line= f"{current_time}\t{ip_address}\t{port}\t{status}\n"
            write_file("test.txt", line, mode='a') 
            # 关闭socket
            sock.close()
        except ValueError:
            print(f"错误: '{port_str}' 不是有效的端口号")
        except socket.gaierror:
            print(f"错误: 无法解析主机名 '{ip_address}'")
        except socket.error as e:
            print(f"错误: 连接时发生错误 - {e}")

# 示例用法
if __name__ == "__main__":
    # 示例调用
    ip = "220.168.146.21"
    #ports = "51133,21133,31133,11133,8477,8669,8769,8201,8209,8213"
    ports = generate_number_range(0, 65536)
    print("开始端口扫描...")
    check_ports(ip, ports)
   
